package ventas;
/**
 * Esta clase representa a una venta con envio.
 */


import sucursal.Sucursal;
import clientes.Cliente;
import clientes.ListaDeCompras;
import envios.Envio;
import exceptions.VentaYaAbonadaException;
import exceptions.VentasException;

/**
 * @author Lucas Alan Silvestri.
 *
 */
public abstract class VentaConEnvio extends Venta {
	
	private Envio envioAProcesar;

	/**
	 * 
	 * @param productosQueDeseaComprar son los productos que desea
	 * comprar el cliente de esta venta.
	 * @param sucursalDondeSeRealizaLaVenta es la sucursal en donde
	 * se esta realizando esta venta.
	 * @param clienteQueDeseaRealizarLaCompra es el cliente que desea
	 * realizar esta compra.
	 */
	public VentaConEnvio(ListaDeCompras unaListaDeCompras,
			Sucursal sucursalDondeSeRealizaLaVenta,
			Cliente clienteQueDeseaRealizarLaCompra) {
		super(unaListaDeCompras, sucursalDondeSeRealizaLaVenta,
				clienteQueDeseaRealizarLaCompra);
	}
	
	/**
	 * @return si el cliente puede pagar los productos.
	 * @throws VentaYaAbonadaException 
	 */
	@Override
	protected abstract boolean elClientePuedePagarLosProductos() throws VentaYaAbonadaException;
	
	/**
	 * cobrara los productos al cliente.
	 * @throws VentaYaAbonadaException 
	 * @throws VentasException 
	 */
	@Override
	protected abstract void cobrarProductos() throws VentaYaAbonadaException, VentasException;
	
	/**
	 * Retorna los productos que estaban siendo por ser
	 * comprados a la sucursal donde se realiza la compra.
	 */
	public abstract void devolverProductos();

	/**
	 * @return que es una venta con envio
	 */
	public boolean soyUnaVentaConEnvio(){
		return true;
	}
	
	/**
	 * @return la venta transformada en una venta.
	 * @throws VentasException 
	 */
	@Override
	public VentaConEnvioYaPagado enviarVentaRealizada() throws VentasException{
			throw new VentasException("No se puede Enviar una venta"
					+ "con envio.");
		}
	
	/**
	 * @return el envio a procesar.
	 */
	public Envio getEnvioAProcesar() {
		return envioAProcesar;
	}

	/**
	 * @param envioAProcesar es el envio a procesar.
	 */
	protected void setEnvioAProcesar(Envio envioAProcesar) {
		this.envioAProcesar = envioAProcesar;
	}
}